package com.newtouch.bxzs.common.base.util;

import cn.hutool.core.util.IdcardUtil;

import com.newtouch.bxzs.common.base.BaseErrorEnum;
import com.newtouch.bxzs.common.base.BaseException;
import com.newtouch.bxzs.common.base.em.CustomerCardTypeEnum;
import org.springframework.util.StringUtils;

/**
 * 校验证件类型
 *
 * <p>
 * <b>History:</b>
 * <table border="1">
 * <tr>
 * <th>Date</th>
 * <th>Operator</th>
 * <th>Memo</th>
 * </tr>
 * <tr>
 * <td>2021/2/3 10:01</td>
 * <td>Amour</td>
 * <td>Create</td>
 * </tr>
 * </table>
 *
 * @author Amour
 * @version 1.0.0
 * @since 1.0.0
 */
public class CheckCertificateTypeUtil {

	/**
	 * 校验军官证
	 *
	 * @param certificateNumber
	 *            证件号
	 */
	private static void checkSoldierCard(String certificateNumber) {
		// 规则： 军/兵/士/文/职/广/（其他中文） + "字第" + 4到8位字母或数字 + "号"
		// 样本： 军字第2001988号, 士字第P011816X号
		String reg = "^[\\u4E00-\\u9FA5](字第)([0-9a-zA-Z]{4,8})(号?)$";

		if (StringUtils.isEmpty(certificateNumber)) {
			throw new BaseException(BaseErrorEnum.CERTIFICATE_NUMBER_ERROR);
		}
		if (!certificateNumber.matches(reg)) {
			throw new BaseException(BaseErrorEnum.CERTIFICATE_NUMBER_ERROR);
		}
	}

	/**
	 * 校验护照
	 *
	 * @param certificateNumber
	 *            证件号
	 */
	private static void checkPassPortCard(String certificateNumber) {
		// 规则： 14/15开头 + 7位数字, G + 8位数字, P + 7位数字, S/D + 7或8位数字,等
		// 样本： 141234567, G12345678, P1234567
		String reg = "^([a-zA-z]|[0-9]){5,17}$";

		if (StringUtils.isEmpty(certificateNumber)) {
			throw new BaseException(BaseErrorEnum.CERTIFICATE_NUMBER_ERROR);
		}
		if (!certificateNumber.matches(reg)) {
			throw new BaseException(BaseErrorEnum.CERTIFICATE_NUMBER_ERROR);
		}
	}

	/**
	 * 校验港澳通行证
	 *
	 * @param certificateNumber
	 *            证件号
	 */
	private static void checkHKCard(String certificateNumber) {
		// 规则： H/M + 10位或6位数字
		// 样本： H1234567890
		String reg = "^([A-Z]\\d{6,10}(\\(\\w\\))?)$";

		if (StringUtils.isEmpty(certificateNumber)) {
			throw new BaseException(BaseErrorEnum.CERTIFICATE_NUMBER_ERROR);
		}
		if (!certificateNumber.matches(reg)) {
			throw new BaseException(BaseErrorEnum.CERTIFICATE_NUMBER_ERROR);
		}
	}

	/**
	 * 校验户口本
	 *
	 * @param certificateNumber
	 *            证件号
	 */
	private static void checkAccountCard(String certificateNumber) {
		// 规则： 15位数字, 18位数字, 17位数字 + X
		// 样本： 441421999707223115
		String reg = "(^\\d{15}$)|(^\\d{18}$)|(^\\d{17}(\\d|X|x)$)";

		if (StringUtils.isEmpty(certificateNumber)) {
			throw new BaseException(BaseErrorEnum.CERTIFICATE_NUMBER_ERROR);
		}

		if (!certificateNumber.matches(reg)) {
			throw new BaseException(BaseErrorEnum.CERTIFICATE_NUMBER_ERROR);
		}
	}

	/**
	 * 校验证件类型,证件号
	 *
	 * @param certificateType
	 *            证件类型
	 * @param certificateNumber
	 *            证件号
	 */
	public static void checkCertificate(String certificateType, String certificateNumber) {
		/* 选择证件类型为身份证时,校验身份证格式 */
		if (CustomerCardTypeEnum.ID_CARD.getCode().equals(certificateType)) {
			/* 校验身份证 */
			if (!IdcardUtil.isValidCard(certificateNumber)) {
				throw new BaseException(BaseErrorEnum.CERTIFICATE_NUMBER_ERROR);
			}
		}
		/* 选择证件类型为军人证时,校验证件号格式 */
		if (CustomerCardTypeEnum.SOLDIER_CARD.getCode().equals(certificateType)) {
			checkSoldierCard(certificateNumber);
		}
		/* 选择证件类型为护照时,校验证件号格式 */
		if (CustomerCardTypeEnum.PASS_PORT.getCode().equals(certificateType)) {
			checkPassPortCard(certificateNumber);
		}
		/* 选择证件类型为港澳通行证时,校验证件号格式 */
		if (CustomerCardTypeEnum.HONGKONG_MACAO_PASS.getCode().equals(certificateType)) {
			checkHKCard(certificateNumber);
		}
		/* 选择证件类型为户口本时,校验证件号格式 */
		if (CustomerCardTypeEnum.HOUSEHOLD_REGISTER.getCode().equals(certificateType)) {
			checkAccountCard(certificateNumber);
		}
	}

}
